package code

import (
	"context"
	"fmt"
	"time"
)

// Concal Context 使用
func Context03() {
	// 一般传递可读字段
	// WithCancel(): parent context 被取消, child context 也会被取消
	// WithoutCancel(): parent context 被取消, child context 不会被取消
	ctx, cancel := context.WithCancel(context.Background())
	ctx2 := context.WithoutCancel(ctx)
	go performTask03(ctx)
	go performTask03(ctx2)
	time.Sleep(time.Second * 2)
	cancel()
	time.Sleep(time.Second * 1)
}

func performTask03(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			// 1. 任务完成、出错、超时等
			// 2. 任务取消
			fmt.Println("task cancelled")
			return
		default:
			fmt.Println("task running")
			time.Sleep(500 * time.Millisecond)
		}
	}
}
